home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 June: Reference Library / Dev.CD Jun 96 RL / Dev.CD Jun 96 RL.toast / What's New? / Development Kits / Apple Game Sprockets DR1 / Examples / DroneZone / DZUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-24  |  2.9 KB  |  168 lines  |  [TEXT/CWIE]

  1. /*
  2.  *    File:        DZUtils.c
  3.  *    Author:        Dan Venolia
  4.  *
  5.  *    Copyright © 1996 Apple Computer, Inc.
  6.  */
  7.  
  8. #include <assert.h>
  9.  
  10. #include <Resources.h>
  11.  
  12. #include <QD3D.h>
  13. #include <QD3DGroup.h>
  14. #include <QD3DIO.h>
  15. #include <QD3DStorage.h>
  16.  
  17. #include "DZUtils.h"
  18.  
  19.  
  20. /* =============================================================================
  21.  *        Get3DMFResource (external)
  22.  *
  23.  *    Gets the '3DMF' resource with the given ID, and reads it using QD3D, and
  24.  *    returns a reference to anything drawable in it.  NULL is returned if a
  25.  *    problem occurs.
  26.  * ========================================================================== */
  27. TQ3Object Get3DMFResource(
  28.     short                inResourceID)
  29. {
  30.     Handle                resource;
  31.     TQ3Object            result;
  32.     TQ3Object            object;
  33.     TQ3Object            group;
  34.     TQ3StorageObject    storage;
  35.     TQ3FileObject        file;
  36.     TQ3FileMode            mode;
  37.     
  38.     resource    = NULL;
  39.     result        = NULL;
  40.     object        = NULL;
  41.     group        = NULL;
  42.     storage        = NULL;
  43.     file        = NULL;
  44.     
  45.     // Grab the resource
  46.     resource = GetResource('3DMF', inResourceID);
  47.     if (resource == NULL || ResError() != noErr)  goto bail;
  48.     
  49.     // Set up for reading
  50.     storage = Q3HandleStorage_New(resource, GetHandleSize(resource));
  51.     if (storage == NULL)  goto bail;
  52.     
  53.     file = Q3File_New();
  54.     if (file == NULL)  goto bail;
  55.     
  56.     if (Q3File_SetStorage(file, storage) != kQ3Success)  goto bail;
  57.     
  58.     if (Q3File_OpenRead(file, &mode) != kQ3Success)  goto bail;
  59.     
  60.     // Read the objects
  61.     group = NULL;
  62.     
  63.     while (!Q3File_IsEndOfFile(file))
  64.     {
  65.         object = Q3File_ReadObject(file);
  66.         if (object != NULL)
  67.         {
  68.             if (Q3Object_IsDrawable(object))
  69.             {
  70.                 if (result == NULL)
  71.                 {
  72.                     // This is the first object
  73.                     result = Q3Shared_GetReference(object);
  74.                 }
  75.                 else
  76.                 {
  77.                     // Make sure we have a group to add it to
  78.                     if (group == NULL)
  79.                     {
  80.                         // Create the new group
  81.                         group = Q3DisplayGroup_New();
  82.                         Q3Group_AddObject(group, result);
  83.                         
  84.                         Q3Object_Dispose(result);
  85.                         result = Q3Shared_GetReference(group);
  86.                     }
  87.                     
  88.                     // Add it to the group
  89.                     assert(group == result);
  90.                     Q3Group_AddObject(result, object);
  91.                 }
  92.             }
  93.             
  94.             Q3Object_Dispose(object);
  95.             object = NULL;
  96.         }
  97.     }
  98.     
  99.     // Get rid of the group reference
  100.     if (group != NULL)
  101.     {
  102.         Q3Object_Dispose(group);
  103.         group = NULL;
  104.     }
  105.     
  106.     // Finish reading
  107.     Q3File_Close(file);
  108.     
  109.     Q3Object_Dispose(file);
  110.     file = NULL;
  111.     
  112.     Q3Object_Dispose(storage);
  113.     storage = NULL;
  114.     
  115.     // Release the resource
  116.     ReleaseResource(resource);
  117.     
  118.     return result;
  119.     
  120.     // Error exit
  121.     bail:
  122.     
  123.     if (resource != NULL)
  124.     {
  125.         ReleaseResource(resource);
  126.         resource = NULL;
  127.     }
  128.     
  129.     if (result != NULL)
  130.     {
  131.         Q3Object_Dispose(result);
  132.         result = NULL;
  133.     }
  134.     
  135.     if (object != NULL)
  136.     {
  137.         Q3Object_Dispose(object);
  138.         object = NULL;
  139.     }
  140.     
  141.     if (group != NULL)
  142.     {
  143.         Q3Object_Dispose(group);
  144.         group = NULL;
  145.     }
  146.     
  147.     if (result != NULL)
  148.     {
  149.         Q3Object_Dispose(result);
  150.         result = NULL;
  151.     }
  152.     
  153.     if (storage != NULL)
  154.     {
  155.         Q3Object_Dispose(storage);
  156.         storage = NULL;
  157.     }
  158.     
  159.     if (file != NULL)
  160.     {
  161.         Q3Object_Dispose(file);
  162.         file = NULL;
  163.     }
  164.     
  165.     return NULL;
  166. }
  167.  
  168.